package org.dxy.domain.model.aggregate;

import org.dxy.domain.command.process.ChangeProcessStepCommand;
import org.dxy.domain.command.process.CompleteProcessCommand;
import org.dxy.domain.command.process.FailProcessCommand;
import org.dxy.domain.command.process.PauseProcessCommand;
import org.dxy.domain.command.process.ResumeProcessCommand;
import org.dxy.domain.command.process.StartProcessCommand;
import org.dxy.domain.command.process.CheckProcessQualityCommand;
import org.dxy.domain.command.process.HoldProcessCommand;
import org.dxy.domain.command.process.ReleaseProcessCommand;
import org.dxy.domain.command.process.ReworkProcessCommand;
import org.dxy.domain.command.process.ScrapProcessCommand;
import org.dxy.domain.command.process.RecordProcessMeasurementCommand;
import org.dxy.domain.command.process.AssignProcessCommand;
import org.dxy.domain.command.process.CreateProcessCommand;
import org.dxy.domain.event.process.ProcessCompletedEvent;
import org.dxy.domain.event.process.ProcessFailedEvent;
import org.dxy.domain.event.process.ProcessPausedEvent;
import org.dxy.domain.event.process.ProcessResumedEvent;
import org.dxy.domain.event.process.ProcessStartedEvent;
import org.dxy.domain.event.process.ProcessStepChangedEvent;
import org.dxy.domain.event.process.ProcessQualityCheckedEvent;
import org.dxy.domain.event.process.ProcessHoldEvent;
import org.dxy.domain.event.process.ProcessReleasedEvent;
import org.dxy.domain.event.process.ProcessReworkedEvent;
import org.dxy.domain.event.process.ProcessScrappedEvent;
import org.dxy.domain.event.process.ProcessMeasurementRecordedEvent;
import org.dxy.domain.event.process.ProcessCreatedEvent;
import org.dxy.domain.model.aggregate.impl.ProcessAggRoot;
import org.dxy.domain.model.valobj.ProcessId;

/**
 * @description: 工序聚合根接口
 * @author: dxy 
 * @createTime: 2025/6/22 17:34 
 * @auther dxy
 */
public interface Process extends AggregateRoot {
    /**
     * 获取工序ID
     * @return 工序ID值对象
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessId getProcessId();

    /**
     * 开始执行工序
     * @param command 开始执行工序命令
     * @return 工序开始执行事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessStartedEvent start(StartProcessCommand command);

    /**
     * 暂停工序
     * @param command 暂停工序命令
     * @return 工序暂停事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessPausedEvent pause(PauseProcessCommand command);

    /**
     * 恢复工序
     * @param command 恢复工序命令
     * @return 工序恢复事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessResumedEvent resume(ResumeProcessCommand command);

    /**
     * 完成工序
     * @param command 完成工序命令
     * @return 工序完成事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessCompletedEvent complete(CompleteProcessCommand command);

    /**
     * 工序失败
     * @param command 工序失败命令
     * @return 工序失败事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessFailedEvent fail(FailProcessCommand command);

    /**
     * 变更工序步骤
     * @param command 工序步骤变更命令
     * @return 工序步骤变更事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessStepChangedEvent changeStep(ChangeProcessStepCommand command);

    /**
     * 工序质量检测
     * @param command 工序质量检测命令
     * @return 工序质量检测完成事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessQualityCheckedEvent checkQuality(CheckProcessQualityCommand command);

    /**
     * 工序挂起
     * @param command 工序挂起命令
     * @return 工序挂起事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessHoldEvent hold(HoldProcessCommand command);

    /**
     * 工序解除挂起
     * @param command 工序解除挂起命令
     * @return 工序解除挂起事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProcessReleasedEvent release(ReleaseProcessCommand command);

    /**
     * 工序返工
     * @param command 工序返工命令
     * @return 工序返工事件
     */
    ProcessReworkedEvent rework(ReworkProcessCommand command);

    /**
     * 工序报废
     * @param command 工序报废命令
     * @return 工序报废事件
     */
    ProcessScrappedEvent scrap(ScrapProcessCommand command);

    /**
     * 工序测量参数记录
     * @param command 工序测量参数记录命令
     * @return 工序测量参数记录事件
     */
    ProcessMeasurementRecordedEvent recordMeasurement(RecordProcessMeasurementCommand command);

    /**
     * 工序分配
     * @param command 工序分配命令
     * @return 工序分配事件
     */
    void assign(AssignProcessCommand command);

    /**
     * 创建工序（静态工厂方法）
     * @param processId 工序ID
     * @param command 创建工序命令
     * @return 工序聚合根
     */
    static Process create(Long processId, CreateProcessCommand command) {
        return ProcessAggRoot.create(processId, command);
    }
} 